# coding:utf-8
import json
import os
import subprocess

import openpyxl
from PySide6.QtWidgets import QWidget, QVBoxLayout, QLabel, QFileDialog, QTableWidgetItem, QCheckBox, \
    QHBoxLayout
from pptx import Presentation
from qfluentwidgets import PushButton, SubtitleLabel, TableWidget, Dialog


class TemplateInterface(QWidget):
    """ 选择文件夹，批量处理 PPTX 文件 """

    def __init__(self, parent=None):
        super().__init__(parent)
        self.setObjectName('templateInterface')

        # 存储 PPTX 文件的相关信息
        self.pptx_files_info = []

        # 创建布局
        self.layout = QVBoxLayout(self)
        self.layout.setContentsMargins(20, 20, 20, 20)
        self.layout.setSpacing(10)

        # 标题
        self.title = SubtitleLabel("请选择文件夹", self)

        # 显示文件夹路径的标签
        self.folderLabel = QLabel("未选择文件夹", self)

        # 选择文件夹按钮
        self.selectButton = PushButton("选择文件夹", self)
        self.selectButton.clicked.connect(self.selectFolder)

        # 下一步按钮
        self.generateTemplateButton = PushButton("生成模板", self)
        self.generateTemplateButton.clicked.connect(self.generateTemplate)

        # 表格展示
        self.tableWidget = TableWidget(self)
        self.tableWidget.setColumnCount(5)  # 文件路径、文件名、图片数量、文本框数量、复选框
        self.tableWidget.setHorizontalHeaderLabels(["文件路径", "文件名", "图片数量", "文本框数量", "原文本"])

        # 添加组件到布局
        self.layout.addWidget(self.title)
        self.layout.addWidget(self.folderLabel)
        self.layout.addWidget(self.selectButton)
        self.layout.addWidget(self.generateTemplateButton)
        self.layout.addWidget(self.tableWidget)

        # 设置表格的列宽
        self.tableWidget.setColumnWidth(0, 250)  # 文件路径列宽
        self.tableWidget.setColumnWidth(1, 150)  # 文件名列宽
        self.tableWidget.setColumnWidth(2, 80)  # 图片数量列宽
        self.tableWidget.setColumnWidth(3, 80)  # 文本框数量列宽
        self.tableWidget.setColumnWidth(4, 110)  # 选择列宽

    def selectFolder(self):
        """ 选择文件夹，并处理该文件夹下的所有 PPTX 文件 """
        with open("config.json", 'r', encoding='utf-8') as file:
            config = json.load(file)
        template_path = config['template_path']
        folder_path = QFileDialog.getExistingDirectory(self, "选择文件夹", template_path)
        if folder_path:  # 如果选择了文件夹
            self.folderLabel.setText(f"已选择: {folder_path}")
            self.process_pptx_files(folder_path)

    # 生成模板excel具体方法
    def generate_excel(self, data, output_file):
        # 创建一个新的工作簿
        workbook = openpyxl.Workbook()
        sheet = workbook.active

        # 设置表头
        headers = ["模板路径", "原文本", "替换文本", "配图文件夹"]
        sheet.append(headers)

        # 填充数据
        for item in data:
            file_path = item.get('file_path', '').replace('/', '\\')
            text = item.get('text', '')
            # 根据需求构造每一行的数据
            row_data = [file_path, text, text, '']
            sheet.append(row_data)

        # 确保路径存在
        output_dir = os.path.dirname(output_file)
        if not os.path.exists(output_dir):
            os.makedirs(output_dir)
        # 保存到指定的文件路径
        workbook.save(output_file)
        print(f"Excel 已保存至 {output_file}")

    # 生成模板excel
    def generateTemplate(self):
        # 调用函数生成 Excel 文件
        with open("config.json", 'r', encoding='utf-8') as file:
            config = json.load(file)
        template_path = config['template_path']
        self.generate_excel(self.pptx_files_info, f'{template_path}\拼图模板.xlsx')
        w = Dialog("生成模板成功", f"生成模板成功,是否查看模板文件?\n", self)
        if w.exec():
            # 打开生成模板的位置
            path = template_path
            subprocess.run(f'explorer {path}', shell=True)
        else:
            print('取消')
        pass

    # 加载所有pptx模板
    def process_pptx_files(self, folder_path):
        """ 遍历文件夹中的所有 PPTX 文件，并提取信息 """
        self.pptx_files_info.clear()  # 清空之前的文件信息
        self.tableWidget.setRowCount(0)  # 清空表格内容

        # 遍历文件夹中的所有文件
        for file in os.listdir(folder_path):
            if file.lower().endswith(".pptx"):  # 仅处理 pptx 文件
                file_path = os.path.join(folder_path, file)
                pptx_info = self.get_info_from_pptx(file_path)

                # 添加到信息列表
                self.pptx_files_info.append(pptx_info)

                # 在表格中添加一行
                row_position = self.tableWidget.rowCount()
                self.tableWidget.insertRow(row_position)

                # 设置表格内容
                self.tableWidget.setItem(row_position, 0, QTableWidgetItem(file_path))  # 文件路径
                self.tableWidget.setItem(row_position, 1, QTableWidgetItem(file))  # 文件名
                self.tableWidget.setItem(row_position, 2, QTableWidgetItem(str(pptx_info['image_num'])))  # 图片数量
                self.tableWidget.setItem(row_position, 3, QTableWidgetItem(str(pptx_info['text_num'])))  # 文本框数量
                self.tableWidget.setItem(row_position, 4, QTableWidgetItem(str(pptx_info['text'])))  # 文本

    # 获取pptx中的图片和文本数量信息
    def get_info_from_pptx(self, pptx_path):
        """ 从 PPTX 文件中获取图片数量和文本框数量 """
        pptx_info = {
            "file_path": pptx_path,
            "file_name": pptx_path.split("/")[-1],
            "image_num": 0,
            "text_num": 0,
            "text": ""
        }

        prs = Presentation(pptx_path)
        # 遍历所有幻灯片
        for slide in prs.slides:
            # 遍历一个幻灯片的所有形状
            for shape in slide.shapes:
                # 递归获取文本框数量
                self.get_pptx_text_num(shape, pptx_info)

        return pptx_info

    # 获取pptx中的图片和文本数量信息具体方法
    def get_pptx_text_num(self, shape, pptx_info):
        """ 递归获取文本框数量 """
        # 如果是图片,并且符合标记
        if shape.shape_type == 13 and shape.name.startswith("img"):
            pptx_info['image_num'] += 1
        if shape.has_text_frame:
            pptx_info['text_num'] += 1
            # 遍历文本框中的段落
            for paragraph in shape.text_frame.paragraphs:
                # 遍历段落中的文字块（保留格式）
                for run in paragraph.runs:
                    pptx_info['text'] += run.text
                pptx_info['text'] += ","
        elif shape.shape_type == 6:
            for shape_i in shape.shapes:
                self.get_pptx_text_num(shape_i, pptx_info)
